package com.cc.od.app;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

/*
@description:
                题目概述
                智能手机在方便我们生活的同时,也侵占了大量时间。手机App防沉迷系统旨在帮助用户合理规划手机app使用时间,确保在正确的时间做正确的事。系统的主要功能包括:
                在一天24小时内,可注册每个app的允许使用时段。
                一个时段只能使用一个app,即不能同时注册多个app在同一时间段内使用。
                app有优先级,数值越高,优先级越高。注册时，如果高优先级的App时间和低优先级的时段有冲突，系统会自动注销低优先级的时段;如果app的优先级相同，则后添加的app不能注册。
                编程实现
                编程实现时，需要处理输入数据,包括App的数量、每个App的注册信息（名称、优先级、起始时间、结束时间）,并根据输入的时间点返回该时间点可用的app名称。如果时间点没有注册任何app,则返回“NA”。
@ClassName AppScheduler
@author chen
@create 2024-09-29 12:16
@Version 1.0
*/
public class AppScheduler {
    private final Map<String, Integer> appPriorityMap;
    private final Map<Integer, String> timeSlotMap;

    public AppScheduler()
    {
        appPriorityMap = new HashMap<>();
        timeSlotMap = new TreeMap<>();
    }

    public static void main(String[] args)
    {
        // 创建Scanner对象，读取系统输入
        Scanner scanner = new Scanner(System.in);

        // 读取并存储输入的程序数量
        int numApps = scanner.nextInt();

        // 消费掉输入中的换行符，准备读取下一行数据
        scanner.nextLine();

        // 创建应用程序调度器实例
        AppScheduler scheduler = new AppScheduler();

        // 循环读取每个应用程序的注册信息，并注册到调度器中
        for (int i = 0; i < numApps; i++)
        {
            String appName = scanner.next();
            int priority = scanner.nextInt();
            String startTime = scanner.next();
            String endTime = scanner.next();
            scheduler.registerApp(appName, priority, startTime, endTime);
        }
        String queryTime = scanner.next();
        System.out.println(scheduler.getAppAtTime(queryTime));
    }


    public void registerApp(String appName, int priority, String startTime, String endTime)
    {
        int startHour = parseTime(startTime);
        int endHour = parseTime(endTime);

        // 如果应用程序还不在优先级映射中，直接添加
        if (!appPriorityMap.containsKey(appName))
        {
            appPriorityMap.put(appName, priority);
        }
        else
        {
            // 如果应用程序已经在优先级映射中，只有当新优先级更高时才更新
            int currentPriority = appPriorityMap.get(appName);
            if (priority < currentPriority)
            {
                return;
            }
            appPriorityMap.put(appName, priority);
        }

        // 遍历应用程序的运行时间，尝试在时间槽映射中注册
        for (int i = startHour; i < endHour; i++)
        {
            // 如果时间槽已经被占用，只有当新优先级更高时才替换
             if(timeSlotMap.containsKey(i))
             {
                 String existingAppName = timeSlotMap.get(i);
                 int existingPriority = appPriorityMap.get(existingAppName);
                 if (priority > existingPriority)
                 {
                     timeSlotMap.put(i, appName);
                 }
             }
             else
             {
                 // 如果时间槽未被占用，直接注册
                 timeSlotMap.put(i, appName);
             }
        }
    }

    public String getAppAtTime(String queryTime)
    {
        // 解析查询时间，返回对应的小时数
        int queryHour = parseTime(queryTime);
        // 根据查询时间对应的小时数，在时间槽映射中查找对应的应用程序名称，如果找不到，则默认返回"NA"
        return timeSlotMap.getOrDefault(queryHour, "NA");
    }

    private int parseTime(String time)
    {
        // 将时间字符串按":"分割，得到小时和分钟部分
        String[] parts = time.split(":");
        // 计算总分钟数,小时数乘以60加上分钟数
        return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]);
    }
}
